package cn.agrael.struts.plugin.ejb3;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.interceptor.InvocationContext;

/**
 * InvocationContext 的实现。
 * 
 * @author <a href="mailto:agraellee@gmail.com">Agrael·Lee</a>
 * 
 */
public class InvocationContextImpl implements InvocationContext {

	/** 目标实例 */
	private final Object target;

	/** 调用 Interceptor 的 Bean 类的方法 */
	private final Method method;

	/** 组装好的拦截器组的迭代器 */
	private final Iterator<InterceptorsAnnotationEntry> interceptorsAnnotationEntryIterator;

	/** 将用来调用业务方法的参数 */
	private Object[] parameters;

	/** 此调用或生命周期回调关联的上下文数据 */
	private Map<String, Object> contextData = new HashMap<String, Object>();

	/**
	 * 构造一个新的 InvocationContextImpl。
	 * 
	 * @param target 目标实例 。
	 * @param method 调用 Interceptor 的 Bean 类的方法。
	 * @param interceptorsAnnotationEntryIterator 组装好的拦截器组的迭代器。
	 */
	protected InvocationContextImpl(Object target, Method method, Iterator<InterceptorsAnnotationEntry> interceptorsAnnotationEntryIterator) {
		this.target = target;
		this.method = method;
		this.interceptorsAnnotationEntryIterator = interceptorsAnnotationEntryIterator;
	}

	public Map<String, Object> getContextData() {
		return this.contextData;
	}

	public Method getMethod() {
		return this.method;
	}

	public Object[] getParameters() {
		return this.parameters;
	}

	public Object getTarget() {
		return this.target;
	}

	public Object proceed() throws Exception {
		if (this.interceptorsAnnotationEntryIterator.hasNext()) {
			// 执行拦截器
			InterceptorsAnnotationEntry interceptorsAnnotationEntry = this.interceptorsAnnotationEntryIterator.next();
			return interceptorsAnnotationEntry.getMethod().invoke(interceptorsAnnotationEntry.getInterceptor(), this);
		}
		// 执行源对象
		return this.method.invoke(this.target, this.parameters);
	}

	public void setParameters(Object[] parameters) {
		this.parameters = parameters;
	}

}
